/* eslint-disable */
// 数据验证中间件

const { checkNull, isJson, handleNumber, checkPhone, checkMail, checkTimeStamp } = require("../rules/verification")

/*
    params: 验证路由时传进来的需要验证的参数
    option：验证钥匙，判断需要进行哪种验证
*/
// vari : verification 简写 中文：验证
const veri = (params, option, mode) => {
    try {
        return (ctx, next) => {
            let data = {}
            switch (mode) { // 获取前台传过来的各种方式的数据
                case "request": data = ctx.request.body || ""; break;
                case "query": data = ctx.query || ""; break;
                case "params": data = ctx.params || ""; break; // 获取id
            }
            const key = {} // 创建一个专门验证的对象
            params.forEach(item => { // 遍历参数数组
                key[item] = data[item] // 需要验证的前台传过来的数据赋值给key
            });
            const pack = [] // 用于存储验证之后的数据的数组
            let res = {}; // 验证之后返回的对象
            for (let i in key) { // 遍历key对象 
                if (option == "Non empty") { // Non empty：非空
                    res = checkNull(key[i], i) // 验证
                } else if (option == "Can have") {
                    if (key[i]) {
                        res = checkNull(key[i], i) // 验证
                    }
                }  else if (option == "phone") {
                    if (key[i]) {
                        res = checkPhone(key[i], i) // 验证
                    }
                } else if (option == "sex") {
                    if (key[i]) {
                        res = checkNull(key[i], i, 2, "sex") // 验证
                    }
                }
                else if (option == "mail") {
                    if (key[i]) {
                        res = checkMail(key[i], i) // 验证
                    }
                } else if (option == "time") {
                    
                } else if (option == "json") {
                    res = isJson(key[i], i) // 验证
                } else if (option == "page") {
                    res = handleNumber(key[i], i)
                }
                pack.push(res) // 将验证之后的对象添加到存储他的数组中
            }
            const errKey = pack.find(item => { // 在验证完的数组中找是否有不符合条件的
                return item.code == "400"
            })
            if (errKey) return ctx.body = errKey
            return next()
        }
    } catch (err) {
        ctx.body = {
            msg: "操作失败",
            code: "400",
            error: err
        }
    }
}


module.exports = {
    veri
}